package channellearn

import (
	"fmt"
	"sync"
	"time"
)

var wg sync.WaitGroup

func ChannelLearnFirst() {
	/*
	   channel提供了一种通信机制
	   python、java中的消息队列
	*/
	var msg chan int //引用类型,需要初始化
	//msg = make(chan int)    // 第一种初始化方式，无缓冲，放数据会报死锁。如需使用，必须在放数据之前，先启动消费者
	msg = make(chan int, 1) // 第二种初始化方式，有缓冲
	//在go语言中，使用make初始化的有三种：slice、map、channel

	msg <- 1      //将1放入到channel中
	msg <- 2      //将2放入到channel中，此时缓存空间满了，依然会出现deadlock死锁的问题
	data := <-msg //将箭头右边的值放入到左边
	fmt.Println(data)
}

func consumer(queue chan int) {
	defer wg.Done()
	//data := <-queue
	//fmt.Println(data)

	//for data := range queue {
	//	fmt.Println(data)
	//	time.Sleep(time.Second) //2肯定已经进来了，关闭后的channel还能取出2吗？答案是可以的。
	//}

	//明明已经关闭了channel，为什么还能源源不断的取数呢？1 2 0 0 0 0 0 。。。
	for {
		data, ok := <-queue
		if !ok {
			break
		}

		fmt.Println(data, ok)
		time.Sleep(time.Second)
	}

}

func ChannelLearnConsumer() {
	msg := make(chan int, 1)
	wg.Add(1)
	go consumer(msg)
	msg <- 1
	msg <- 2

	//关闭channel, 1.已经关闭的channel不能再发送数据了
	// 2.关闭后的channel,还能从里面去数据吗？答案是可以，已经关闭的channel,能够继续接收数据，直到取完数据为止
	close(msg)
	//msg <- 3
	wg.Wait()
}
